package com.baibei.ebec.sdk;

import com.baibei.model.AddressInfo;
import com.baibei.model.BalanceInfo;
import com.baibei.model.BankInfo;
import com.baibei.model.CouponResponseInfo;
import com.baibei.model.CustomerWxInfo;
import com.baibei.model.FollowMessageInfo;
import com.baibei.model.FollowMsgInfo;
import com.baibei.model.FundTimeInfo;
import com.baibei.model.HelpContentInfo;
import com.baibei.model.MarqueeInfo;
import com.baibei.model.MsgInfo;
import com.baibei.model.MsgNoticeInfo;
import com.baibei.model.MsgStatusInfo;
import com.baibei.model.NewMarqueeInfo;
import com.baibei.model.PayModeInfo;
import com.baibei.model.RechargeFormInfo;
import com.baibei.model.ServiceQQInfo;
import com.baibei.model.UserAuthInfo;
import com.baibei.model.UserInfo;
import com.baibei.model.WelfareRankInfo;
import com.baibei.model.XinStatusInfo;
import com.baibei.sdk.Empty;

import java.util.List;

import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.PUT;

/**
 * 用户接口
 * Created by ChenRui on 2017/4/28 0028 14:00.
 */
public interface IUserApi {

    /**
     * 个人用户
     */
    int TYPE_PERSONAL = 0;

    /**
     * 企业用户
     */
    int TYPE_ENTERPRISE = 1;

    @POST(ApiConstant.API_TOKEN_SIGN_IN)
    @FormUrlEncoded
    Observable<UserInfo> signIn(@Field("mobile") String mobile,
                                @Field("password") String password,
                                @Field("invitationCode") String invitationCode,
                                @Field("imei") String imei);

    /**
     * 个人注册
     *
     * @param mobile         手机号
     * @param password       密码
     * @param invitationCode 邀请码
     * @param smsCode        短信验证码
     * @param channel        安卓渠道名
     */
    @POST(ApiConstant.API_USER_REGISTER)
    @FormUrlEncoded
    Observable<Empty> register(@Field("mobile") String mobile,
                               @Field("password") String password,
                               @Field("invitationCode") String invitationCode,
                               @Field("verifyCode") String smsCode,
                               @Field("channel") String channel,
                               @Field("imei") String imei,
                               @Field("inviteCode") String inviteCode);

    /**
     * 企业注册
     *
     * @param mobile            手机号
     * @param password          密码
     * @param smsCode           短信验证码
     * @param legalPersonName   法人姓名
     * @param legalPersonCertNo 法人身份证号
     * @param bizLicencePicture 营业执照图片URL
     */
    @POST(ApiConstant.API_ENTERPRISE_REGISTER)
    @FormUrlEncoded
    Observable<Empty> enterpriseRegister(@Field("mobile") String mobile,
                                         @Field("password") String password,
                                         @Field("verifyCode") String smsCode,
                                         @Field("legalPersonName") String legalPersonName,
                                         @Field("legalPersonCertNo") String legalPersonCertNo,
                                         @Field("bizLicencePicture") String bizLicencePicture);


    /**
     * 重置登录密码
     *
     * @param mobile   手机号码
     * @param password 密码
     * @param smsCode  短信验证码
     */
    @PUT(ApiConstant.API_USER_RESET_PASSWORD)
    @FormUrlEncoded
    Observable<Empty> resetLoginPassword(@Field("mobile") String mobile,
                                         @Field("password") String password,
                                         @Field("verifyCode") String smsCode);


    /**
     * 获取余额
     */
    @POST(ApiConstant.API_ACCOUNT_BALANCE)
    Observable<BalanceInfo> getBalanceInfo();

    /**
     * 获取可用余额
     */
    @POST(ApiConstant.API_ACCOUNT_VALID_BALANCE)
    Observable<BalanceInfo> getValidBalanceInfo();


    /**
     * 加载地址
     */
    @POST(ApiConstant.API_USER_ADDRESS)
    @FormUrlEncoded
    Observable<List<AddressInfo>> getAddress(@Field("isDefault") String isDefault);

    /**
     * 修改地址
     */
    @POST(ApiConstant.API_USER_ADDRESS_UPDATE)
    @FormUrlEncoded
    Observable<AddressInfo> updateAddress(@Field("id") String id, @Field("receivingMobile") String mobile,
                                          @Field("receivingAddress") String address,
                                          @Field("receivingName") String receivingName,
                                          @Field("postcode") String postcode,
                                          @Field("region") String region,
                                          @Field("isDefault") int isDefault);

    /**
     * 新增地址
     */
    @POST(ApiConstant.API_USER_ADDRESS_UPDATE)
    @FormUrlEncoded
    Observable<AddressInfo> addAddress(@Field("receivingMobile") String mobile,
                                       @Field("receivingAddress") String address,
                                       @Field("receivingName") String receivingName,
                                       @Field("postcode") String postcode,
                                       @Field("region") String region,
                                       @Field("isDefault") int isDefault);

    /**
     * 新增地址
     */
    @POST(ApiConstant.API_USER_ADDRESS_DELETE)
    @FormUrlEncoded
    Observable<Empty> deleteAddress(@Field("id") String id);

    /**
     * 新增地址
     */
    @POST(ApiConstant.API_USER_ADDRESS_DEFAULT)
    @FormUrlEncoded
    Observable<Empty> setAddressDefault(@Field("id") String id);

    /**
     * 充值
     */
    @POST(ApiConstant.API_ACCOUNT_BALANCE_RECHARGE)
    @FormUrlEncoded
    Observable<RechargeFormInfo> recharge(@Field("amount") double amount, @Field("fundPassword") String fundPassword);

    /**
     * 建议金额
     */
    @POST(ApiConstant.API_SUGGEST_INFUNDS)
    Observable<SuggestInFundInfo> getSuggestRechargeInfo();

    /**
     * 充值渠道
     */
    @POST(ApiConstant.API_PAY_CHANNEL)
    @FormUrlEncoded
    Observable<List<PayModeInfo>> getPayModeList(@Field("payType") int payType);

    /**
     * 提现
     * "data":{
     * "amount": 1000,
     * "province": "",
     * "city": "",
     * "bank": "ABC",
     * "subBank": "中国农业银行",
     * "bankAccount": "440923456784741",
     * "realName": "陈贺年",
     * "fundPassword": "资金密码"
     * }
     *
     * @return return
     */
    @POST(ApiConstant.API_ACCOUNT_BALANCE_WITHDRAW)
    @FormUrlEncoded
    Observable<Empty> withdrawAmout(@Field("amount") String amount,
                                    @Field("province") String province,
                                    @Field("city") String city,
                                    @Field("bank") String bankCode,
                                    @Field("subBankName") String subBank,
                                    @Field("bankAccount") String bankAccount,
                                    @Field("realName") String realName,
                                    @Field("fundPassword") String fundPassword,
                                    @Field("verifyCode") String verifyCode);

    /**
     * 银行列表
     *
     * @return return
     */
    @POST(ApiConstant.API_ACCOUNT_BLANKS)
    Observable<List<BankInfo>> getBankList();

    /**
     * 退出登录
     *
     * @return
     */
    @POST(ApiConstant.API_TOKEN_SIGN_OUT)
    Observable<Empty> signOut();


    /**
     * 重置资金密码
     *
     * @param fundPassword fundPassword
     * @param verifyCode   verifyCode
     * @return return
     */
    @POST(ApiConstant.API_ACCOUNT_RESET_PASSWORD)
    @FormUrlEncoded
    Observable<Empty> resetFundPassword(@Field("fundPassword") String fundPassword, @Field("verifyCode") String verifyCode);

    /**
     * 设置资金密码
     *
     * @param fundPassword fundPassword
     * @param verifyCode   verifyCode
     * @return return
     */
    @POST(ApiConstant.API_ACCOUNT_CREATE_PASSWORD)
    @FormUrlEncoded
    Observable<Empty> setFundPassword(@Field("fundPassword") String fundPassword, @Field("verifyCode") String verifyCode);


    /**
     * 获取用户信息
     *
     * @return return
     */
    @POST(ApiConstant.API_USERINFO)
    Observable<UserInfo> getUserInfo();

    /**
     * 实名认证
     *
     * @param realName realName
     * @param certNo   certNo
     * @return return
     */
    @POST(ApiConstant.API_REALNAME_IDENTIFY)
    @FormUrlEncoded
    Observable<Empty> realNameIdentify(@Field("realName") String realName, @Field("certNo") String certNo);

    /**
     * 校验资金密码
     */
    @POST(ApiConstant.API_FUND_VERIFYPWD)
    @FormUrlEncoded
    Observable<Empty> fundVerifyPwd(@Field("fundPassword") String fundPassword);

    /**
     * 获取出入金时间信息
     * "type":"IN" //IN-入金，OUT-出金
     */
    @POST(ApiConstant.API_GET_FUND_TIME_INFO)
    @FormUrlEncoded
    Observable<FundTimeInfo> getFundTimeInfo(@Field("type") String type);


    /**
     * 获取用户实名信息
     *
     * @return return
     */
    @POST(ApiConstant.API_USER_AUTH_INFO)
    Observable<UserAuthInfo> getUserAuthInfo();


    /**
     * 查找体验券
     *
     * @return return
     */
    @POST(ApiConstant.API_COUPON_QUERY)
    Observable<CouponResponseInfo> queryCouponInfos();

    /**
     * 查找体验券
     *
     * @return return
     */
    @POST(ApiConstant.API_QUERY_QQ)
    Observable<ServiceQQInfo> queryQQ();

    @POST(ApiConstant.API_QUERY_QQ_URL)
    Observable<ServiceQQInfo> queryQQUrl();

    /**
     * 检查更新
     */
    @GET(ApiConstant.API_CHECK_UPDATE)
    Observable<Empty> checkUpdate();

    /**
     * 获取首页跑马灯内容
     */
    @GET(ApiConstant.API_GET_MARQUEE)
    Observable<List<MarqueeInfo>> getMarquee();

    /**
     * 获取首页跑马灯内容
     */
    @GET(ApiConstant.API_GET_MARQUEE_NEW)
    Observable<List<NewMarqueeInfo>> getNewMarquee();

    /**
     * 消息中心是否有新消息
     */
    @POST(ApiConstant.API_IF_NEW_MSG)
    @FormUrlEncoded
    Observable<List<MsgStatusInfo>> getIfHasNewMsg(@Field("userId") String userId,
                                             @Field("accessToken") String accessToken);

    /**
     * 获取消息中心的系统消息
     */
    @POST(ApiConstant.API_GET_SYS_MSG)
    @FormUrlEncoded
    Observable<List<MsgInfo>> getSysMsg(@Field("userId") String userId,
                                        @Field("accessToken") String accessToken);

    /**
     * 获取消息中心的系统公告
     */
    @POST(ApiConstant.API_GET_SYS_NOTICE)
    @FormUrlEncoded
    Observable<List<MsgNoticeInfo>> getSysMsgNotices(@Field("userId") String userId,
                                                  @Field("accessToken") String accessToken);

    /**
     * 获取消息中心跟投消息
     */
    @POST(ApiConstant.API_GET_FOLLOW_MSG)
    @FormUrlEncoded
    Observable<List<FollowMessageInfo>> getFollowMsg(@Field("userId") String userId);

    /**
     * 消息首页是否显示“新”字
     */
    @POST(ApiConstant.API_IF_SHOW_XIN)
    Observable<XinStatusInfo> getIfShowXin();

    /**
     * 获取每日盈利版排行信息
     */
    @POST(ApiConstant.API_GET_WELFARE_RANK_INFO_DAY)
    Observable<List<WelfareRankInfo>> getWelfareRankInfoDay();

    /**
     * 获取每周盈利版排行信息
     */
    @POST(ApiConstant.API_GET_WELFARE_RANK_INFO_WEEK)
    Observable<List<WelfareRankInfo>> getWelfareRankInfoWeek();

    /**
     * 获取每月盈利版排行信息
     */
    @POST(ApiConstant.API_GET_WELFARE_RANK_INFO_MONTH)
    Observable<List<WelfareRankInfo>> getWelfareRankInfoMonth();

    /**
     * 获取充值帮助信息
     */
    @GET(ApiConstant.API_GET_RECHARGE_HELP)
    Observable<List<HelpContentInfo>> getRechargeHelp();

    /**
     * 获取客服微信号
     */
    @GET(ApiConstant.API_GET_CUSTOMER_WX_CODE)
    Observable<CustomerWxInfo> getCustomerWX();
}
